home *** CD-ROM | disk | FTP | other *** search
- ; PC y COMPATIBLES
- ; ****************************************
- ; *** PROT2.COM v1.0 / JCE May 1992 ***
- ; ****************************************
- ; Sistema de protecciones por marca fisica
- ;
- ; Juan C. Enrique
- ;
- ; ---------------------------------------
- ; Si el disco llave se encuentra en
- ; drive A: escribe 'OK!',sino lo pide.
- ; ---------------------------------------
- ; NO SE PUEDE PARAR CON CTRL+C
- ;
-
- CODE_SEG SEGMENT PUBLIC
- ASSUME CS:CODE_SEG, DS:CODE_SEG, SS:CODE_SEG
-
- entrada EQU DS:82h
-
- ORG 100h
-
- PROT2_COM:
-
- XOR AX,AX
- MOV ES,AX
- CLI
- MOV WORD PTR ES:[08CH],OFFSET INT23
- MOV WORD PTR ES:[08EH],CS
- STI
-
-
- MOV DI,OFFSET entrada ; entrada valor en ASCII
- CALL CONVERT ; conversion
- MOV WORD PTR DS:[num_sect],AX ; almacena valor convertido en WORD
-
- JMP run2
-
- run:
- MOV DX,OFFSET MSG11
- MOV AH,9
- INT 21H
- wait_key:
- MOV AH,1
- INT 21H
- CMP AL,13 ; espera a que se pulse ENTER
- JNE wait_key
-
- run2:
- MOV DX,0 ;
- MOV BX,OFFSET BUFFER ; Analiza el sector 0 para saber
- MOV CX,1 ; si hay disco en la unidad A.
-
- CALL redisk
- CLC
- XOR AX,AX
- INT 25H
- POP DI
- JC no_disk
-
- CALL REDISK
- CLC ; CARRY=0
- XOR AX,AX
- INT 26H ; Reescribe sect 0
- POP DI
- JC disco_protegido
-
- CALL comprueba_codigo ; busca CODIGO en sect-1
-
- MOV DX,WORD PTR DS:[num_sect] ; num. de sector marcado
- MOV BX,OFFSET CODIGO ; dir transferencia de RAM
- MOV CX,1
-
- CALL redisk
- CLC
-
- ; XOR AX,AX
- ; INT 26H ; escribe en sect marcado
- ; POP DI
-
- CALL redisk
- CLC
- XOR AX,AX
- INT 25H ; Lee
- POP DI
- JC original
- CALL redisk
- XOR AX,AX
- INT 25H
- POP DI
- JC original
- CALL redisk
- XOR AX,AX
- INT 25H
- POP DI
- JC original
-
- no_disco_original:
- MOV DX,OFFSET MSG1
- MOV AH,9
- INT 21H
- JMP run
-
- disco_protegido:
- MOV DX,OFFSET MSG2
- MOV AH,9
- INT 21H
- JMP wait_key
- ; ------------------------------
- ; OK. sector y codigo correctos
- ; ------------------------------
-
- original:
- INT 20H ; vuelve al DOS
-
- no_disk:
- JMP run
-
- ;
- ; comprobacion del codigo o num. de ref. intoducido por TESTDSK
- ;
-
- comprueba_codigo:
-
- MOV CX,1
- MOV DX,WORD PTR DS:[num_sect]
- DEC DX
- MOV BX,OFFSET BUFFER
- XOR AX,AX
- CLC
- INT 25H ; lee sect-1 y lo deja en BUFFER
- POP DI
-
- JC comp_error
-
- MOV BX,OFFSET BUFFER
- MOV DX,OFFSET CODIGO
- MOV CX,17
- comp_bucle:
- PUSH BX
- PUSH DX
- MOV AH,[BX]
- MOV DX,BX
- MOV AL,[BX]
- CMP AH,AL
- JNE no_disco_original ; el codigo no coincide
- POP DX
- POP BX
- INC BX
- INC DX
- LOOP comp_bucle
- RET
-
- comp_error:
- MOV DX,OFFSET BEEP
- MOV AH,9
- INT 21H ; BEEP control
-
- JMP no_disco_original
-
-
- ;
- ; Parcheo INT23 (Break CTRL+C)
- ;
-
- INT23:
-
- PUSH AX
- PUSH DX
-
- MOV DL,7
- MOV AL,6
- MOV AH,12
- INT 21H
-
- POP DX
- POP AX
-
- CLC ; Indica seguir programa
-
- IRET
-
- ; ==============================
- ; Reinicializa sistema diskettes
- ; ==============================
-
- redisk:
- PUSH AX
- PUSH DX
- MOV DL,0
- XOR AX,AX
- INT 13H
- POP DX
- POP AX
- RET
-
- ;
- ; =============================================================
- ; Esta rutina convierte el ascii de cuatro caracteres apuntado
- ; por DI en su correspondiente numero y lo convierte en una
- ; palabra (2bytes) que devuelve en AX.
- ; =============================================================
- ;
-
- CONVERT:
- MOV AL,BYTE PTR [DI+0]
- CALL convert_hex_digit
- JC valor_incorrecto
- SHL AL,1
- SHL AL,1
- SHL AL,1
- SHL AL,1
- PUSH AX
- MOV AL,BYTE PTR [DI+1]
- JC valor_incorrecto
- CALL convert_hex_digit
- POP BX
- OR AL,BL
- MOV AH,AL
- PUSH AX
- MOV AL,BYTE PTR [DI+2]
- CALL convert_hex_digit
- JC valor_incorrecto
- SHL AL,1
- SHL AL,1
- SHL AL,1
- SHL AL,1
- PUSH AX
- MOV AL,BYTE PTR [DI+3]
- CALL convert_hex_digit
- JC valor_incorrecto
- POP BX
- OR AL,BL
- MOV BL,AL
- POP AX
- MOV AL,BL
- RET
-
- valor_incorrecto:
- JMP valor_incorrecto ; cuelgue
-
- ;-----------------------------------------------------
- ; P.Norton:
- ; Convierte el car de AL en un NIBBLE devuelto en AL
- ; carry se activa si hay error
- ;-----------------------------------------------------
-
- CONVERT_HEX_DIGIT:
-
- CMP AL,'0'
- JB BAD_DIGIT
- CMP AL,'9'
- JA TRY_HEX
- SUB AL,'0'
- CLC
- RET
- TRY_HEX:
- CMP AL,'A'
- JB BAD_DIGIT
- CMP AL,'F'
- JA BAD_DIGIT
- SUB AL,'A'-10
- CLC
- RET
- BAD_DIGIT:
- STC
- RET
-
-
- ;
- ; *** MENSAJES ***
- ;
-
- MSG1: db 7,10,13
- db "*** ATENCION ESTE NO ES EL DISCO-LLAVE ORIGINAL ***$$$"
-
- MSG11: db 10,13,"Introduzca en 'A' el disco-llave y pulse ENTER ...$$$"
-
- MSG2: db 10,13
- db "* Disco protegido contra escritura. Desprotejalo y "
- db "pulse ENTER *$$$"
-
- BEEP: db 7,"$"
- ;
-
-
- num_sect:
- db 0,0
-
- CODIGO: db "JCE-06091972VIRGO$ "
-
- BUFFER: db 0
-
-
- CODE_SEG ENDS
- END PROT2_COM
-
-